#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max_Size 114514
/*算法流程：函数中传入原线性表（传址），设定下标迭代变量（或指针）分别指向线性表的头元素（左半边）和尾元素（右半边）
两个下标变量相向遍历逐个扫描线性表内元素，每次扫描到不符合筛选条件（左半边：遇到偶数，右半边：遇到奇数）的便停止
当某次扫描结束后，设定指向左半的变量下标值超过指向右半的变量下标值时，遍历结束，退出算法（算法终点判断）
每次扫描结束并判断下标合法后，交换两个下标对应的顺序表元素
交换完成后，进入下一次扫描，直到迭代变量达到上述的终点条件，退出算法
该算法不考虑原表是否有序，最终表也不保证其有序性，每次运行需要将顺序表中所有的元素至少检查一次，时间复杂度为O(n)。*/
void practice1(int List[],int i)
{
    int j=0,k=i;
    while (1)
    {
        for(;List[j]%2==1;++j);
        for(;List[k]%2==0;--k);
        if(j>k) break;
        int temp=List[j];
        List[j]=List[k];
        List[k]=temp;
    }
}

int main()
{
    
    char line[Max_Size];
    while(gets(line)!=NULL)
    {
        int temp=0,i=-1,j=0;
        int a[Max_Size];
        for(j;j!=strlen(line);++j)
        {
            if(line[j]>='0'&&line[j]<='9')
            {
                temp=temp*10+(line[j]-'0');
            }
            else
            {
                a[++i]=temp;
                temp=0;
            }
        }
        if(line[j-1]>='0'&&line[j-1]<='9')
        {
            a[++i]=temp;
            temp=0;
        }
        practice1(a,i);
        for(int k=0;k<=i;++k) printf("%d ",a[k]);
        printf("\n");
    }
    system("pause");
    return 0;
}